package com.vehicle.coupon.consumer;

import com.alibaba.fastjson.JSON;
import com.rabbitmq.client.Channel;
import com.vehicle.coupon.constant.RabbitmqConstants;
import com.vehicle.coupon.domain.CouponRecord;
import com.vehicle.coupon.domain.CouponRecordCopy1;
import com.vehicle.coupon.mapper.CouponRecordCopy1Mapper;
import com.vehicle.coupon.service.ICouponRecordCopy1Service;
import com.vehicle.coupon.service.ICouponRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;


/**
 * @author:cocoKe
 * @Description:
 * @VERSON:1.8
 * @create:2025-04-07 22:32
 * @Date:2025/4/7
 */
@Component
@Slf4j
public class DirectConsumer {

    @Autowired
    private ICouponRecordService couponRecordService;

    @Autowired
    RedisTemplate redisTemplate;
    @Autowired
    RabbitTemplate rabbitTemplate;

    @Autowired
    private ICouponRecordCopy1Service couponRecordCopy1Service;


    /**
     * 监听指定队列的消息，并进行处理
     * @param msg 从队列中接收到的消息内容
     * @param channel 消息通道，用于与 RabbitMQ 进行交互，如确认消息、拒绝消息等操作
     * @param amqpMessage 封装的 AMQP 消息对象，包含消息的属性和内容
     */
    @RabbitListener(queues = RabbitmqConstants.QUEUE_NAME)
    public void process(String msg, Channel channel, Message amqpMessage) {

        // 标记消息是否消费成功，初始化为 false
        boolean consumeSuccess = false;
        try {
            // 记录收到消息的日志信息
            log.info("DirectConsumer收到消息："+msg);
            // 从 Redis 中根据消息内容获取对应的优惠券信息
            String coupon = String.valueOf(redisTemplate.opsForValue().get(msg));
            // 将从 Redis 中获取的优惠券信息 JSON 字符串解析为 CouponRecord 对象
            CouponRecord record = JSON.parseObject(coupon, CouponRecord.class);

            // 调用优惠券记录服务的插入方法，尝试将优惠券记录插入到数据库中
            int i = couponRecordService.insertCouponRecord(record);

            // 如果插入成功，插入记录数会大于 0
            if (i  > 0) {
                // 获取消息的投递标签，用于后续的消息确认操作
                long deliveryTag = amqpMessage.getMessageProperties().getDeliveryTag();
                // 手动确认消息消费成功，第二个参数 false 表示不批量确认
                channel.basicAck(deliveryTag, false);
                // 记录消息消费成功并已确认的日志信息
                log.info("消息消费成功，已确认，msg: {}", msg);

                // 从 Redis 中删除该消息对应的请求记录，避免重复处理
                redisTemplate.delete(msg);
                // 标记消息消费成功
                consumeSuccess = true;
            } else {
                // 记录优惠券领取失败的日志信息
                log.error("优惠券领取失败，msg: {}", msg);
            }
        } catch (Exception e) {
            // 记录处理消息时发生异常的日志信息，并打印异常堆栈
            log.error("处理消息时发生异常，msg: {}", msg, e);
        }

        // 如果消息消费失败
        if (!consumeSuccess) {
            try {
                // 获取消息的投递标签
                long deliveryTag = amqpMessage.getMessageProperties().getDeliveryTag();
                // 拒绝消息，第二个参数 false 表示不批量拒绝，第三个参数 false 表示不将消息重回队列
                channel.basicNack(deliveryTag, false, false);
                // 记录消息消费失败并已拒绝的日志信息
                log.error("消息消费失败，已拒绝，msg: {}", msg);
            } catch (IOException e) {
                // 记录拒绝消息时发生异常的日志信息，并打印异常堆栈
                log.error("拒绝消息时发生异常，msg: {}", msg, e);
            }
        }



//        Object requestId = message.get("requestId");
//        Object couponId = message.get("couponId");
//        Object userId = message.get("userId");
//        log.info("DirectConsumer收到消息："+requestId);
//
//
//        boolean consumeSuccess = false;
//        try {
//            // mysql 中优惠券库存减少
//            Boolean result = couponRecordService.receiveCoupon(Long.parseLong(couponId.toString()),
//                    Long.parseLong(userId.toString()), requestId.toString());
//
//            if (result) {
//                // 手动确认消息消费成功
//                long deliveryTag = amqpMessage.getMessageProperties().getDeliveryTag();
//                channel.basicAck(deliveryTag, false);
//                log.info("消息消费成功，已确认，requestId: {}", requestId);
//
//                // 在 redis 中删除请求记录
//                redisTemplate.delete(requestId.toString());
//                consumeSuccess = true;
//            } else {
//                log.error("优惠券领取失败，requestId: {}", requestId);
//            }
//        } catch (Exception e) {
//            log.error("处理消息时发生异常，requestId: {}", requestId, e);
//        }
//
//        if (!consumeSuccess) {
//            try {
//                long deliveryTag = amqpMessage.getMessageProperties().getDeliveryTag();
//                // 拒绝消息，根据业务需求决定是否重回队列，这里设置为不重回队列
//                channel.basicNack(deliveryTag, false, false);
//                log.error("消息消费失败，已拒绝，requestId: {}", requestId);
//            } catch (IOException e) {
//                log.error("拒绝消息时发生异常，requestId: {}", requestId, e);
//            }
//        }


    }

}
